热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

03|高性能IO模型:为什么单线程Redis能那么快?

03|高性能IO模型:为什么单线程Redis能那么快?-1.基本概念什么是redis的单线程(核心功能在单线程上,并不是所有功能)redis的网络IO和键值对读写是由一
1.基本概念
  • 什么是redis的单线程(核心功能在单线程上,并不是所有功能)

    • redis的网络IO和键值对读写是由一个线程完成的(redis的核心服务)

    • redis的其他功能由额外线程完成

      • 持久化
      • 异步删除
      • 集群数据同步
2.redis为什么用单线程
  • 多线程的开销

    • 使用多线程可以增加系统吞吐率(每个请求),增加系统扩展性

    • 无限的增加线程数,导致吞吐量下降

      • 被多线程同时访问共享资源,比如共享的数据结构
      • 为了保证线程安全,导致性能的牺牲
      • 粗粒度的锁导致所有串行,系统的吞吐率随着线程的增加而增加
  • 因此为了节省并发资源的管理,redis使用单线程,保证所有操作串行化

\

3.单线程的redis为什么快
  • redis大部分操作都在内存上+高效的数据结构
  • redis采用多路复用机制,在网络中处理大量客户端请求,实现高吞吐率
4.socket
  • socket通信过程(网络IO处理+键值对读写+网络IO处理)

    • SimpleKV 为了处理一个 Get 请求
    • 需要监听客户端请求(bind/listen)
    • 和客户端(代码)建立连接(accept)
    • 从 socket 中读取请求(recv)
    • 解析客户端发送请求(parse)
    • 根据请求类型读取键值数据(get)
    • 最后给客户端返回结果,即向 socket 中写回数据(send)
  • 潜在的阻塞点

    • accept() 未能成功建立连接时,会一直阻塞\

    • recv() 从客户端读取数据时,会一直阻塞\

  • socket的非阻塞模式
  • 保证 Redis 线程,既不会像基本 IO 模型中一直在阻塞点等待,也不会导致 Redis 无法处理实际到达的连接请求或数据
  • Linux 中的 IO 多路复用机制\

5.多路复用
  • Linux中的IO多路复用机制指一个线程处理多个IO流,select/poll

  • 在单线程下,同时存在监听多个套接字和已连接套接字

  • 具体实现

    • FD是多个套接字

    • Redis使用epoll机制,让内核监听套接字

    • Redis可以和多个客户端连接并处理请求,从而提升并发性

    • select/epoll提供了基于事件的回调机制,针对不同的事件调用对应的处理函数

      • 首先将事件放入事件队列,无需润徐请求是否实际发生,避免CPU资源浪费
      • 根据相应的事件执行响应的操作

6.总结
  • redis真的是单线程吗

    • 对网络 IO 和数据读写的操作采用了一个线程\
  • 为什么用单线程

    • 避免多线程开发的并发控制问题
    • 多路复用的 IO 模型密切相关\
  • 单线程为什么这么快

\


推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
亲亲羊to
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有